package org.example.demo1.controller;

import org.springframework.ai.document.Document;
import org.springframework.ai.reader.tika.TikaDocumentReader;
import org.springframework.ai.transformer.splitter.TokenTextSplitter;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamResource;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.lang.annotation.Documented;
import java.util.List;
import java.util.stream.Collectors;

@RestController
public class EmbeddingController {

    @Autowired
    VectorStore vectorStore;

    //基于向量数据库 实现的知识文档存储和语义搜索
    @PostMapping("ai/vectorStore")
    public List<String> vectorStore(@RequestParam(name = "file") MultipartFile file) throws IOException {
        //io流中读取文件
        TikaDocumentReader tikaDocumentReader=new TikaDocumentReader(new InputStreamResource(file.getInputStream()));

        //将文件内容划分成更小的块 这里的tokensplitter是利用token长度来切割文本
        List<Document> splitDocuments=new TokenTextSplitter()
                .apply(tikaDocumentReader.read());

        //将文本存入数据库 其实这里本质上也是调用了我们选用的文本矢量化模型（将文本转换成向量）
        vectorStore.add(splitDocuments);
        return splitDocuments.stream().map(Document::getText).collect(Collectors.toList());
    }

    @GetMapping("ai/vectorSearch")
    public List<String> vectorSearch(@RequestParam(name="text")String text){
        // 1. 构造一个搜索请求，把用户输入文本当作查询条件
        SearchRequest searchRequest = SearchRequest.builder()
                .query(text)
                .topK(1) // 只取最相似的1条
                .build();

        // 2. 调用向量数据库搜索，返回最相似的Document列表
        List<Document> documents = vectorStore.similaritySearch(searchRequest);
        return documents.stream().map(Document::getText).collect(Collectors.toList());
    }
}
